﻿/*
 * Пример к статье: Разработка desktop-приложения для «ВКонтакте» на C#
 * Автор: Алексей Немиро
 * http://aleksey.nemiro.ru
 * http://foxtools.ru
 * http://kbyte.ru
 * 24.07.2011
 * 
 * По всем вопросам обращайтесь на форум:
 * http://kbyte.ru/ru/Forums?id=0
 */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Threading;
using System.Threading.Tasks;

using ABDLight.Components;

namespace ABDLight
{
  public partial class frmProgress : Form
  {
    public event EventHandler FormDead;
    public static frmProgress frm;
    private bool FormOpen = false;
      
    delegate void ToBrogressBar();
    ToBrogressBar ToBarFunc;

    public frmProgress()
    {
      InitializeComponent();
     
    }

    private void frmProgress_Load(object sender, EventArgs e)
    {

    }

    public delegate void DelegateSetDescription(string str);
    public void SetDescription(string str)
    {
      if (this.InvokeRequired)
      {
        this.Invoke(new DelegateSetDescription(SetDescription), str);
        return;
      }
      Application.DoEvents();
    }

    private delegate void DelegateSetTag(object t);
    public void SetTag(object t)
    {
      if (this.InvokeRequired)
      {
        this.Invoke(new DelegateSetTag(SetTag), t);
        return;
      }
      this.Tag = t;
      Application.DoEvents();
    }

    private delegate void DelegateCloseMe();
    public void CloseMe()
    {
      if (this.InvokeRequired)
      {
        this.Invoke(new DelegateCloseMe(CloseMe));
      
        return;
      }
      EventHandler handler = FormDead;
      if (handler != null) { handler(this, null); }
      this.Close();
    }

    private void pictureBox1_Click(object sender, EventArgs e)
    {

    }

    private void lblDescription_Click(object sender, EventArgs e)
    {

    }

    public void btnStopClean_Click(object sender, EventArgs e)
    {
        //this.Close();
        if (sender != null)
            ((frmClean)this.Owner).TasksCanceled();
        string result = "";
        frm.SetDescription("Команда остановлена.");
        // передаем результат в Tag формы прогресса
        frm.SetTag(result);
        // закрываем форму прогресса
        frm.CloseMe();
    }


    public string ExecuteCommand(string name/*, frmProgress frm*/, Hashtable _pars = null)
    {
        FormOpen = true;
        // создаем прогресс
        //frmProgress frm = new frmProgress();
        //frm.Owner = Program.applicationContext.MainForm;
        // передаем параметры в Tag формы прогресса
        if (_pars == null)
        {
            _pars = new Hashtable();
        }

        _pars.Add("name", name);

        frm.Tag = _pars;

        if (name == "Clean")
        {
            frm.pgbClean.Visible = true;
            frm.btnStopClean.Visible = true;
            pgbClean.Minimum = 0;
            pgbClean.Maximum = SQLiteData.GetRecordCount(ABDLight.Properties.Settings.Default.CleanFileName);
            pgbClean.Value = 0;

        }
        // запускаем процесс выполнения запроса в отдельном потоке
        Thread t = new Thread(ExecuteCommandThread);
        t.IsBackground = true;
        t.Start(frm);

        // показываем прогесс
        frm.ShowDialog();
        FormOpen = false;
        // возвращаем результат из Tag формы прогресса
        return (string)frm.Tag;
    }
    private void ExecuteCommandThread(object args)
    {
        frm = (frmProgress)args;
        string name = ((Hashtable)frm.Tag)["name"].ToString();
        string DB_Name = "";

        frm.SetDescription(String.Format("Выполняю команду {0}", name));

        string result = "";
        if (name == "Clean")
        {
            Thread t = new Thread(ProgressBarUpd);
            t.IsBackground = true;
            t.Start(frm);

            ((frmClean)this.Owner).TreadClean();
            //ProgressBarUpd();
        }
        if (name == "SavetoDB")
        {
            string TabName = ABDLight.Properties.Settings.Default.CleanFileName;
            SQLiteData.DBCreate();
            SQLiteData.CreateTable(((frmMine)this.Owner).dtMain, TabName);
            SQLiteData.InsertTable(((frmMine)this.Owner).dtMain, TabName);
        }
        if (name == "OpenTextFileToDB")
        {
            ((frmLoad)this.Owner).OpenTextFileToDB(frm);
        }
        if (name == "CheckFile")
        {
            CSVWork.CleanFileJoin();
        }

        frm.SetDescription("Команда успешно выполнена.");

        // передаем результат в Tag формы прогресса
        frm.SetTag(result);
        // закрываем форму прогресса
        frm.CloseMe();
    }
    private void ProgressBarUpd(object args)
    {
        ToBarFunc = new ToBrogressBar(ToPBar);
        while(FormOpen)
        {
            if (frmClean.RecordCleanCount == null) continue;
            pgbClean.Invoke(ToBarFunc);
            System.Threading.Thread.Sleep(1000);

        }
    }

    void ToPBar()
    {
        int CleanCount = 0;
        foreach (int i in frmClean.RecordCleanCount)
        {
            CleanCount += i;
        }
        if (CleanCount > pgbClean.Maximum) CleanCount = pgbClean.Maximum;
        pgbClean.Value = CleanCount;
    }

  }
}
